import open3d as o3d
import numpy as np
import laspy

# 1. 读取 LAS 文件
las_file = laspy.read("/mnt/d/temp_files/part_pointCloud.las")

# 2. 提取点云数据
points = np.vstack((las_file.x, las_file.y, las_file.z)).transpose()

# 3. 创建 Open3D 点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)

# 4. 提取强度数据（确保 LAS 文件包含 intensity 字段）
if hasattr(las_file, 'intensity'):
    intensity = np.asarray(las_file.intensity, dtype=np.float64)
else:
    raise ValueError("LAS 文件中没有 'intensity' 字段！")

# 5. 将强度归一化到 [0, 1] 范围，并映射为灰度或彩色
def intensity_to_color(intensity_values, colormap='gray'):
    """
    将强度值映射为 RGB 颜色。
    支持 colormap: 'gray', 'jet', 'viridis', 'plasma' 等（需 matplotlib）
    """
    # 归一化到 [0, 1]
    normalized = (intensity_values - intensity_values.min()) / (intensity_values.max() - intensity_values.min() + 1e-8)
    print("  强度值范围: [{}, {}]", intensity_values.min(), intensity_values.max())
    # 使用 matplotlib colormap（可选）
    try:
        import matplotlib.pyplot as plt
        cmap = plt.get_cmap(colormap)
        colors = cmap(normalized)[:, :3]  # 取 RGB，忽略 alpha
    except ImportError:
        # 如果没有 matplotlib，使用简单灰度
        colors = np.stack([normalized, normalized, normalized], axis=1)
    
    return colors

# 6. 应用颜色（这里使用 'plasma' colormap，你也可以改成 'gray', 'jet', 'viridis' 等）
pcd.colors = o3d.utility.Vector3dVector(intensity_to_color(intensity, colormap='plasma'))

# 7. 可视化
print("正在显示点云（按强度着色）...")
print(" - 拖动鼠标: 旋转视角")
print(" - 滚轮: 缩放")
print(" - 鼠标左键 + Ctrl: 平移")
print(" - 窗口右上角的『X』: 关闭窗口")

o3d.visualization.draw_geometries([pcd],
                                  window_name="Point Cloud Colored by Intensity",
                                  width=1024,
                                  height=768)